//OpenSSL 能帮助我们生成秘钥对
const crypto = require('crypto');
const path = require('path');
const resolve = filepath => path.join(__dirname, filepath);
//TODO 散列算法也叫哈希算法，用来把任意长度的输入变换成固定长度的输出,常见的有md5,sha1等
//又称之为摘要

//摘要 可以用来实现缓存(相同的输入会产生相同的输出)
//可以用来检验数据在传输中没有被篡改(注意因为算法是公开的，所以也不定安全)

//支持的所有hash算法↓↓
// console.log(crypto.getHashes());
/*
[ 'RSA-MD4',
  'RSA-MD5',
  'RSA-MDC2',
  'RSA-RIPEMD160',
  'RSA-SHA1',
  'RSA-SHA1-2',
  'RSA-SHA224',
  'RSA-SHA256', // 签名
  'RSA-SHA384',
  'RSA-SHA512',
  'blake2b512',
  'blake2s256',
  'md4',
  'md4WithRSAEncryption',
  'md5',
  'md5-sha1',
  'md5WithRSAEncryption',
  'mdc2',
  'mdc2WithRSA',
  'ripemd',
  'ripemd160',
  'ripemd160WithRSA',
  'rmd160',
  'sha1', // 加盐算法
  'sha1WithRSAEncryption',
  'sha224',
  'sha224WithRSAEncryption',
  'sha256',
  'sha256WithRSAEncryption',
  'sha384',
  'sha384WithRSAEncryption',
  'sha512',
  'sha512WithRSAEncryption',
  'ssl3-md5',
  'ssl3-sha1',
  'whirlpool' ]
*/

//md5不算是真正的加密，它只是一种摘要 加密要能解密才算加密(暴力破解的不算(比如碰撞检测))
/*
可以对MD5算法进行反向查询，有一个密文对应查询数据库(好几百T)

加密 因为相同的输入会有相同的输出
故按道理 你只需要将所有的输入得到的输出 连原本的输入 放在一个数据库里
我们就能反向推出输入
*/

//摘要具备以下特征：
// 1.相同的输入会产生相同的输出
// 2.不同的输出会产生不同的输出
// 3.任意的输入长度输出长度是相同的
// 4.不能从输出推算出输入的值

//用法：
/*let md5 = crypto.createHash('md5');
md5.update('ahhh你好'); //要进行摘要的字符串
let r = md5.digest('hex'); //latin1|hex(←16进制)|base64 //以什么样的编码输出
console.log('r:',r); //52c356981ec1ca2af2a96afce50c9139*/

//↑↓等价
// console.log(crypto.createHash('md5').update('ahhh你好').digest('hex')); //52c356981ec1ca2af2a96afce50c9139

//可以多次加密
/*md5 = crypto.createHash('md5');
md5.update(r);
r = md5.digest('hex');
console.log('r',r);*/




//一个非常大的文件 我们不会通过fs.readFile这样一次性读出来 而是使用流的形式 分块读取大文件
/*const md5 = crypto.createHash('md5');

let rs = require('fs').createReadStream(resolve('content.txt'), {highWaterMark: 2});
rs.on('data', (chunk) => {
  md5.update(chunk); //update能调用多次
});
rs.on('end', () => {
  console.log(md5.digest('hex')); //9e4676b3cb4d10143b39640be8c04d38 //注意虽然update能多次调用 但digest只能调用一次
});
console.log(crypto.createHash('md5').update(require('fs').readFileSync(resolve('content.txt'))).digest('hex')); //9e4676b3cb4d10143b39640be8c04d38 //可以发现上下两种方式结果是一样的*/







